home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Blender 2.49b / blender-2.49b-windows.exe / $_4_ / .blender / scripts / bpymodules / BPyAddMesh.py < prev    next >
Text File  |  2009-08-31  |  4KB  |  160 lines

  1. import Blender
  2. from Blender.Window import EditMode, GetCursorPos, GetViewQuat
  3. import bpy
  4. import BPyMessages
  5.  
  6. def add_mesh_simple(name, verts, edges, faces):
  7.     '''
  8.     Adds a mesh from verts, edges and faces
  9.     
  10.     name  - new object/mesh name
  11.     verts - list of 3d vectors
  12.     edges - list of int pairs
  13.     faces - list of int triplets/quads
  14.     '''
  15.     
  16.     scn = bpy.data.scenes.active
  17.     if scn.lib: return
  18.     ob_act = scn.objects.active
  19.  
  20.     is_editmode = EditMode()
  21.  
  22.     cursor = GetCursorPos()
  23.     quat = None
  24.     if is_editmode or Blender.Get('add_view_align'): # Aligning seems odd for editmode, but blender does it, oh well
  25.         try:    quat = Blender.Mathutils.Quaternion(GetViewQuat())
  26.         except:    pass
  27.     
  28.     # Exist editmode for non mesh types
  29.     if ob_act and ob_act.type != 'Mesh' and is_editmode:
  30.         EditMode(0)
  31.     
  32.     # We are in mesh editmode
  33.     if EditMode():
  34.         me = ob_act.getData(mesh=1)
  35.         
  36.         if me.multires:
  37.             BPyMessages.Error_NoMeshMultiresEdit()
  38.             return
  39.         
  40.         # Add to existing mesh
  41.         # must exit editmode to modify mesh
  42.         EditMode(0)
  43.         
  44.         me.sel = False
  45.         
  46.         vert_offset = len(me.verts)
  47.         edge_offset = len(me.edges)
  48.         face_offset = len(me.faces)
  49.         
  50.         # transform the verts
  51.         txmat = Blender.Mathutils.TranslationMatrix(Blender.Mathutils.Vector(cursor))
  52.         if quat:
  53.             mat = quat.toMatrix()
  54.             mat.invert()
  55.             mat.resize4x4()
  56.             txmat = mat * txmat
  57.         
  58.         txmat = txmat * ob_act.matrixWorld.copy().invert()
  59.         
  60.         
  61.         me.verts.extend(verts)
  62.         # Transform the verts by the cursor and view rotation
  63.         me.transform(txmat, selected_only=True)
  64.         
  65.         if vert_offset:
  66.             me.edges.extend([[i+vert_offset for i in e] for e in edges])
  67.             me.faces.extend([[i+vert_offset for i in f] for f in faces])
  68.         else:
  69.             # Mesh with no data, unlikely
  70.             me.edges.extend(edges)
  71.             me.faces.extend(faces)        
  72.     else:
  73.         
  74.         # Object mode add new
  75.         
  76.         me = bpy.data.meshes.new(name)
  77.         me.verts.extend(verts)
  78.         me.edges.extend(edges)
  79.         me.faces.extend(faces)
  80.         me.sel = True
  81.         
  82.         # Object creation and location
  83.         scn.objects.selected = []
  84.         ob_act = scn.objects.new(me, name)
  85.         scn.objects.active = ob_act
  86.         
  87.         if quat:
  88.             mat = quat.toMatrix()
  89.             mat.invert()
  90.             mat.resize4x4()
  91.             ob_act.setMatrix(mat)
  92.         
  93.         ob_act.loc = cursor
  94.     
  95.     me.calcNormals()
  96.     
  97.     if is_editmode or Blender.Get('add_editmode'):
  98.         EditMode(1)
  99.         
  100.         
  101.             
  102.  
  103.  
  104. def write_mesh_script(filepath, me):
  105.     '''
  106.     filepath - path to py file
  107.     me - mesh to write
  108.     '''
  109.     
  110.     name = me.name
  111.     file = open(filepath, 'w')
  112.     
  113.     file.write('#!BPY\n')
  114.     file.write('"""\n')
  115.     file.write('Name: \'%s\'\n' % name)
  116.     file.write('Blender: 245\n')
  117.     file.write('Group: \'AddMesh\'\n')
  118.     file.write('"""\n\n')
  119.     file.write('import BPyAddMesh\n')
  120.     file.write('from Blender.Mathutils import Vector\n\n')
  121.     
  122.     file.write('verts = [\\\n')
  123.     for v in me.verts:
  124.         file.write('Vector(%f,%f,%f),\\\n' % tuple(v.co))
  125.     file.write(']\n')
  126.     
  127.     file.write('edges = []\n') # TODO, write loose edges
  128.     
  129.     file.write('faces = [\\\n')
  130.     for f in me.faces:
  131.         file.write('%s,\\\n' % str(tuple([v.index for v in f])))
  132.     file.write(']\n')
  133.     
  134.     file.write('BPyAddMesh.add_mesh_simple("%s", verts, edges, faces)\n' % name)
  135.  
  136. # The script below can make a file from a mesh with teh above function...
  137. '''
  138. #!BPY
  139. """
  140. Name: 'Mesh as AddMesh Script'
  141. Blender: 242
  142. Group: 'Mesh'
  143. Tip: ''
  144. """
  145. import BPyAddMesh
  146. reload(BPyAddMesh)
  147.  
  148. import bpy
  149.  
  150. def main():
  151.     # Add error checking
  152.     scn = bpy.data.scenes.active
  153.     ob = scn.objects.active
  154.     me = ob.getData(mesh=1)
  155.     
  156.     BPyAddMesh.write_mesh_script('/test.py', me)
  157.  
  158. main()
  159. '''
  160.